home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / gui / prcgntn1.lha / Precognition / source / PObject.c < prev    next >
C/C++ Source or Header  |  1992-12-23  |  3KB  |  148 lines

  1. /* ==========================================================================
  2. **
  3. **                               PObject.c
  4. **
  5. **   ⌐1991 WILLISoft
  6. **
  7. ** ==========================================================================
  8. */
  9.  
  10. #include <exec/types.h>
  11. #include "PObject.h"
  12. #include "PObjectClass.h"
  13. #include "stdlib.h"
  14. #include "AmigaMem.h"
  15.  
  16. void SetObjectName( PObject *self, char *name );
  17.  
  18. #ifdef VERBOSE
  19. void DumpClassChain( struct PObjectClass *class )
  20. {
  21.    for( ; class!=NULL; class=class->isa )
  22.    {      
  23.       printf("%s", class->ClassName );
  24.       if (class->isa) printf("->");
  25.    }
  26.    printf("\n");
  27. }
  28. #endif
  29.  
  30.  
  31. void PObject_CleanUp( PObject *self )
  32. {
  33.    SetObjectName( self, NULL );
  34. }
  35.  
  36.  
  37.  
  38. void CleanUp( PObject *self )
  39. {
  40.    struct PObjectClass *class;
  41.    void *prev_cleaner = NULL;
  42.  
  43.  
  44.    if (self)
  45.    {
  46.       /* call cleanup routines for entire parent hierarchy. */
  47.       for (class = (struct PObjectClass *) self->isa;
  48.            class != NULL;
  49.            class = class->isa )
  50.       {         
  51.          if (class->CleanUp)
  52.          {
  53.             if ((void*) class->CleanUp != prev_cleaner)
  54.             {
  55.                (*class->CleanUp)( self );
  56.                prev_cleaner = (void*) class->CleanUp;
  57.             }
  58.          }
  59.       }
  60.    }
  61. }
  62.  
  63.  
  64. const char *ClassName( const PObject *self )
  65. {
  66.    struct PObjectClass *class;
  67.    char *name = NULL;
  68.  
  69.    if (self)
  70.       if (class = (struct PObjectClass *) self->isa)
  71.          name = class->ClassName;
  72.  
  73.    return name;
  74. }
  75.  
  76. BOOL isa( const PObject *self,
  77.           const Class   *class )
  78. {
  79.    struct PObjectClass *self_class;
  80.    struct PObjectClass *c;
  81.  
  82.    c = (struct PObjectClass *) class;
  83.    if (self)
  84.    {
  85.       /* Traverse inheritence tree of self. */
  86.       for ( self_class  = self->isa;
  87.             self_class != NULL;
  88.             self_class  = self_class->isa )
  89.       {
  90.          /*printf("isa(\"%s\", \"%s\")\n",*/
  91.          /*   self_class->ClassName, c->ClassName );*/
  92.          if (self_class->ClassName == c->ClassName)
  93.          {
  94.             /*printf("Match!\n");*/
  95.             return TRUE;
  96.       }  }
  97.    }
  98.  
  99.    /*printf("No Match.\n");*/
  100.    return FALSE;
  101. }
  102.  
  103.  
  104. char *ObjectName( PObject *self )
  105.    if (self) return self->PObjectName; 
  106.    return NULL;
  107. }
  108.  
  109. char *PObjectName( PObject *self ) { return ObjectName(self); }
  110.  
  111. void SetObjectName( PObject *self, char *name )
  112.    if (self == NULL) return;
  113.  
  114.    Afree( self->PObjectName );
  115.    self->PObjectName = Astrdup(name); 
  116. }
  117.  
  118. BOOL PObject_elaborated = FALSE;
  119.  
  120. struct PObjectClass PObject_Class;
  121.  
  122. void PObjectClass_Init( struct PObjectClass *class )
  123. {
  124.    class->isa        = NULL;
  125.    class->ClassName  = "PObject";
  126.    class->CleanUp    = PObject_CleanUp;
  127. }
  128.  
  129.  
  130. const struct PObjectClass *PObjectClass( void )
  131. {
  132.    if (! PObject_elaborated)
  133.    {
  134.       PObjectClass_Init( &PObject_Class );
  135.       PObject_elaborated = TRUE;
  136.    }
  137.  
  138.    return &PObject_Class;
  139. }
  140.  
  141. void PObject_Init( PObject *self )
  142. {
  143.    self->isa         = PObjectClass();
  144.    self->PObjectName = NULL;
  145. }
  146.